/*
 * @Author: mat
 * @Date: 2020-05-15 14:12:07
 * @LastEditTime: 2021-03-19 14:53:58
 * @Description: 全局公用的方法封装
 */

/* eslint-disable*/

/**
 * @description: 防抖： 在触发完事件的n秒内不再触发事件才执行
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} immediate 是否立刻触发
 * @param {*} context this指向
 */
function debounce(func, wait, immediate, context) {
	var timeout
	const debounced = function() {
		const args = arguments
		if (timeout) clearTimeout(timeout)
		if (immediate) {
			// 如果已经执行过，不再执行
			const callNow = !timeout
			timeout = setTimeout(function() {
				timeout = null
			}, wait)
			if (callNow) func.apply(context, args)
		} else {
			timeout = setTimeout(function() {
				func.apply(context, args)
			}, wait)
		}
	}
	debounced.cancel = function() {
		clearTimeout(timeout)
		timeout = null
	}
	return debounced
}

/**
 * @description: 节流： 如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function throttle(func, wait, context, options) {
	var timeout, args, result
	var previous = 0
	if (!options) options = {}

	var later = function() {
		previous = options.leading === false ? 0 : new Date().getTime()
		timeout = null
		func.apply(context, args)
		if (!timeout) args = null
	}

	var throttled = function() {
		var now = new Date().getTime()
		if (!previous && options.leading === false) previous = now
		var remaining = wait - (now - previous)
		args = arguments
		if (remaining <= 0 || remaining > wait) {
			if (timeout) {
				clearTimeout(timeout)
				timeout = null
			}
			previous = now
			func.apply(context, args)
			if (!timeout) args = null
		} else if (!timeout && options.trailing !== false) {
			timeout = setTimeout(later, remaining)
		}
	}
	return throttled
}
/**
 * @description: 简化版节流：使用时间戳实现，如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function simpleThrottle(func, wait, context) {
	var timeout, args
	return function() {
		args = arguments
		if (!timeout) {
			timeout = setTimeout(function() {
				timeout = null
				func.apply(context, args)
			}, wait)
		}
	}
}
function getArrayIndex(arrays, obj) {
	var i = arrays.length
	while (i--) {
		if (arrays[i] === obj) {
			return i
		}
	}
	return false
}
function resizeListener(chart) {
	window.addEventListener('resize', function() {
		chart.resize()
	})
}
/**
 * 深拷贝
 * @param {Array,Object} obj
 */
function deepCopy(obj) {
	// 根据obj的类型判断是新建一个数组还是一个对象
	let newObj = obj instanceof Array ? [] : {}
	for (let key in obj) {
		// 判断属性值的类型，如果是对象递归调用深拷贝
		newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
	}
	return newObj
}

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function(fmt) {
	//author: meizz
	var o = {
		'M+': this.getMonth() + 1, //月份
		'd+': this.getDate(), //日
		'h+': this.getHours(), //小时
		'm+': this.getMinutes(), //分
		's+': this.getSeconds(), //秒
		'q+': Math.floor((this.getMonth() + 3) / 3), //季度
		S: this.getMilliseconds() //毫秒
	}
	if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
	for (var k in o) if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
	return fmt
}

function getWebsocket(url, errorFn, openFn, messageFn, closeFn) {
	let websocket = null

	if ('WebSocket' in window) {
		websocket = new WebSocket(url)
	} else {
		alert('当前浏览器 Not support websocket')
	}

	websocket.onerror = errorFn
	websocket.onopen = openFn
	websocket.onmessage = messageFn
	websocket.onclose = closeFn
	window.onbeforeunload = function() {
		closeFn()
	}
	return websocket
}

// 获取灾害类型
function getDisasterType(typeCode) {
	let disasterType = ''
	switch (typeCode) {
		case 10:
			disasterType = '台风'
			break
		case 11:
			disasterType = '暴雨'
			break
		case 12:
			disasterType = '暴雪'
			break
		case 13:
			disasterType = '冰雹'
			break
		case 14:
			disasterType = '干旱'
			break
		default:
			break
	}
	return disasterType
}
function arrayTrimSpace(array) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] == ' ' || array[i] == null || typeof array[i] == 'undefined') {
			array.splice(i, 1)
			i = i - 1
		}
	}
	return array
}
// 数组扁平化
function flatten(arr) {
	// 这里的some 判断 整个arr中是否有符合条件的就是true
	while (arr.some((item) => Array.isArray(item))) {
		arr = [].concat(...arr) // 每次循环之后，arr都会扁平化一层
	}
	return arr
}
export { debounce, throttle, simpleThrottle, getArrayIndex, resizeListener, deepCopy, getWebsocket, getDisasterType, arrayTrimSpace, flatten }
